Estoy recorriendo una serie de objetos y tratando de ver si hay una mejor manera de escribir esto (siento que la hay).
Esta es mi función a continuación.
getCallInfo = (callSch: any, security: any) => { const callObj = { CallTimingType: 'Not Callable', isCheckMark: null, }; if (!security.IsCallable) return callObj; callSch.Calls.forEach((el: { CallTimingType: string }) => { if (el.CallTimingType === CallTimingType.SpecificDates) { callObj.CallTimingType = 'Discrete'; callObj.isCheckMark = true; } if ( el.CallTimingType === CallTimingType.AnyTime || el.CallTimingType === CallTimingType.Monthly || el.CallTimingType === CallTimingType.OnPaymentDates || el.CallTimingType === CallTimingType.AnyInterestAdjustmentDate ) { callObj.CallTimingType = 'Continuous'; callObj.isCheckMark = true; } }); return callObj; }; básicamente, lo que está haciendo es devolver el objeto predeterminado si security.IsCallable es falso pero si es verdadero, recorrer la matriz de objetos y establecer el objeto predeterminado en diferentes valores. Lo que básicamente estoy haciendo es tratar de refactorizar esto. CallTimingType es un objeto con estos valores de enumeración. ¿Alguna idea?
Podría usar Array.prototype.some() para iterar y probar si el.CallTimingType coincide con algún valor.
if ( el.CallTimingType === CallTimingType.AnyTime || el.CallTimingType === CallTimingType.Monthly || el.CallTimingType === CallTimingType.OnPaymentDates || el.CallTimingType === CallTimingType.AnyInterestAdjustmentDate )Se puede reescribir como:
const callTimingTypes = [ CallTimingType.AnyTime, CallTimingType.Monthly, CallTimingType.OnPaymentDates, CallTimingType.AnyInterestAdjustmentDate ]; if (callTimingTypes.some((t) => el.CallTimingType === t))Puede reescribir su cláusula con el operador de switch case para que quede claro:
callSch.Calls.forEach((el: { CallTimingType: string }) => { switch (el.CallTimingType) { case CallTimingType.SpecificDates: callObj.CallTimingType = 'Discrete'; callObj.isCheckMark = true; break; case CallTimingType.AnyTime: case CallTimingType.Monthly: case CallTimingType.OnPaymentDates: case CallTimingType.AnyInterestAdjustmentD: callObj.CallTimingType = 'Continuous'; callObj.isCheckMark = true; break; } }); Alternativamente, puede usar Set :
callSch.Calls.forEach((el: { CallTimingType: string }) => { const discreteSet = new Set([CallTimingType.SpecificDates]); const continuousSet = new Set([ CallTimingType.AnyTime, CallTimingType.Monthly, CallTimingType.OnPaymentDates, CallTimingType.AnyInterestAdjustmentD, ]); if (discreteSet.has(el.CallTimingType)) { callObj.CallTimingType = 'Discrete'; callObj.isCheckMark = true; } else if (continuousSet.has(el.CallTimingType)) { callObj.CallTimingType = 'Continuous'; callObj.isCheckMark = true; } });